package model

import (
	"fmt"
)

// 接口的定义：定义规则、定义规范，定义某种能力：
type SayHello interface {
	// 声明没有实现的方法
	sayHello()
}

// 接口的实现：定义一个结构体：
// 中国人：
type Chinese struct {
	name string
}

// 实现接口的方法---》具体的实现：
func (person Chinese) sayHello() {
	fmt.Println("进入 (person *Chinese) sayHello：", person)
	fmt.Println("你好")
}

// 中国人特有的方法
func (person Chinese) niuYangGe() {
	fmt.Println("东北文化-扭秧歌")
}

// 接口的实现：定义一个结构体：
// 美国人：
type American struct {
	name string
}

// 实现接口的方法---》具体的实现：
func (person American) sayHello() {
	fmt.Println("hi")
}

// 定义一个函数：专门用来各国人打招呼的函数，接收具备SayHello接口的能力的变量：
func Greet(s SayHello) {
	s.sayHello()
	//断言：
	/*ch, flag := s.(*Chinese) //看s是否能转成Chinese类型并且赋给ch变量
	if flag {
		ch.niuYangGe()
	} else {
		fmt.Println("美国人不会扭秧歌")
	}*/

	//Type Switch 是 Go 语言中一种特殊的 switch 语句，它比较的是类型而不是具体的值。
	//它判断某个接口变量的类型，然后根据具体类型再做相应处理。
	switch s.(type) {
	case Chinese:
		ch := s.(Chinese)
		ch.niuYangGe()
		break
	case American:
		am := s.(American)
		am.sayHello()
		break
	}

	fmt.Println("打招呼。。。")
}
